#!/usr/bin/env python3
"""
Script to parse uORB message format to ROS msg format
Adapted from https://github.com/eProsima/px4_to_ros/blob/master/px4_to_ros2_PoC/px4_msgs/scripts/copy_and_rename.py
"""

import os
import re
import sys
from shutil import copyfile

__author__ = 'PX4 Development Team'
__copyright__ = \
    '''
     '
     '   Copyright (c) 2018 PX4 Development Team. All rights reserved.
     '
     ' Redistribution and use in source and binary forms, or without
     ' modification, permitted provided that the following conditions
     ' are met:
     '
     ' 1. Redistributions of source code must retain the above copyright
     '    notice, list of conditions and the following disclaimer.
     ' 2. Redistributions in binary form must reproduce the above copyright
     '    notice, list of conditions and the following disclaimer in
     '    the documentation and/or other materials provided with the
     '    distribution.
     ' 3. Neither the name PX4 nor the names of its contributors may be
     '    used to endorse or promote products derived from self software
     '    without specific prior written permission.
     '
     ' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     ' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, NOT
     ' LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     ' FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     ' COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     ' INCIDENTAL, SPECIAL, EXEMPLARY, CONSEQUENTIAL DAMAGES (INCLUDING,
     ' BUT NOT LIMITED TO, OF SUBSTITUTE GOODS OR SERVICES; LOSS
     ' OF USE, DATA, PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     ' AND ON ANY THEORY OF LIABILITY, IN CONTRACT, STRICT
     ' LIABILITY, TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     ' ANY WAY OUT OF THE USE OF THIS SOFTWARE, IF ADVISED OF THE
     ' POSSIBILITY OF SUCH DAMAGE.
     '
    '''
__credits__ = ['Nuno Marques <nuno.marques@dronesolution.io>']
__license__ = 'BSD-3-Clause'
__version__ = '0.1.0'
__maintainer__ = 'Nuno Marques'
__email__ = 'nuno.marques@dronesolution.io'
__status__ = 'Development'

input_dir = sys.argv[1]
output_dir = sys.argv[2]


def main():
    print("-----------------------          \033[1mmicroRTPS bridge uORB to ROS messages\033[0m          -----------------------")
    print("-------------------------------------------------------------------------------------------------------")

    if not os.path.exists(os.path.abspath(output_dir)):
        os.mkdir(os.path.abspath(output_dir))
    else:
        ros_msg_dir = os.path.abspath(output_dir)
        msg_files = os.listdir(ros_msg_dir)
        for msg in msg_files:
            if msg.endswith(".msg"):
                os.remove(os.path.join(ros_msg_dir, msg))

    msg_list = list()

    for filename in os.listdir(input_dir):
        if '.msg' in filename:
            msg_list.append(filename.rstrip('.msg'))
            input_file = input_dir + filename

            output_file = output_dir + \
                filename.partition(".")[0].title().replace('_', '') + ".msg"
            copyfile(input_file, output_file)

    for filename in os.listdir(output_dir):
        if '.msg' in filename:
            input_file = output_dir + filename

            fileUpdated = False

            with open(input_file, 'r') as f:
                lines = f.readlines()
                newlines = []
                alias_msgs = []
                alias_msg_files = []

                for line in lines:
                    for msg_type in msg_list:
                        if ('px4/' + msg_type + ' ') in line:
                            fileUpdated = True
                            line = line.replace(('px4/' + msg_type),
                                                msg_type.partition(".")[0].title().replace('_', ''))

                        if re.findall('^' + msg_type + '[\s\[]', line.partition('#')[0]):
                            fileUpdated = True
                            line = line.replace(msg_type,
                                                msg_type.partition(".")[0].title().replace('_', ''))
                        if '# TOPICS' in line:
                            fileUpdated = True
                            alias_msgs += line.split()
                            alias_msgs.remove('#')
                            alias_msgs.remove('TOPICS')
                            line = line.replace(line, '')
                    newlines.append(line)

            for msg_file in alias_msgs:
                with open(output_dir + msg_file.partition(".")[0].title().replace('_', '') + ".msg", 'w+') as f:
                    for line in newlines:
                        f.write(line)

            if fileUpdated:
                with open(input_file, 'w+') as f:
                    for line in newlines:
                        f.write(line)

    print("--\t\t- Generated {} ROS message files in '{}'".format(len(os.listdir(output_dir)), os.path.abspath(output_dir)))
    print("-------------------------------------------------------------------------------------------------------")


if __name__ == '__main__':
    main()
